package in.view.delegate; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout.LayoutParams; import java.util.ArrayList; import in.controller.adapter.ThreadAdapter; import in.controller.adapter.ThreadAdapter.Mode; import in.controller.adapter.base.RobinAdapter; import in.lib.utils.Debug; import in.lib.utils.StringUtils; import in.model.Post; import in.rob.client.R; import in.view.holder.ThreadPostHolder; public class ThreadPostDelegate extends PostDelegate { private static final int MAX_INDENT = 8; public ThreadPostDelegate(RobinAdapter<Post> adapter) { super(adapter); } public int getLayout() { return R.layout.thread_post_view; } @Override public View getView(Post item, int position, View convertView, ViewGroup parent, LayoutInflater inflater) { ThreadPostHolder holder; if (convertView == null) { convertView = inflater.inflate(getLayout(), parent, false); holder = new ThreadPostHolder(convertView); holder.getReply().setOnClickListener(this); holder.getReplyAll().setOnClickListener(this); holder.getRepost().setOnClickListener(this); holder.getMore().setOnClickListener(this); convertView.setTag(holder); } else { holder = (ThreadPostHolder)convertView.getTag(); } convertView.setTag(R.id.TAG_POSITION, position); holder.populate(item); if (((ThreadAdapter)getAdapter()).getMode() == Mode.NESTED) { setIndentation(convertView, item); } else { ((ViewGroup)convertView).getChildAt(0).setVisibility(View.GONE); } return convertView; } @Override public boolean onItemLongClick(int position, View view) { if (((ThreadAdapter)getAdapter()).getMode() == Mode.NESTED) { String id = getAdapter().getItem(position).getOriginalId(); int indent = ((ThreadAdapter)getAdapter()).getIndentSpec().get(id); for (int index = position, count = getAdapter().getCount(); index < count; index++) { String childId = getAdapter().getItem(index).getOriginalId(); int childIndent = ((ThreadAdapter)getAdapter()).getIndentSpec().get(childId); if (childIndent <= indent && index != position) { break; } if (index == position) { ((ThreadAdapter)getAdapter()).getCollapsedReference().put(id, new ArrayList<String>()); } else { ((ThreadAdapter)getAdapter()).getCollapsedReference().get(id).add(childId); } } getAdapter().notifyDataSetChanged(); return true; } else { getAdapter().getListView().getOnItemClickListener().onItemClick(getAdapter().getListView(), view, position, getAdapter().getItemId(position)); return true; } } public void setIndentation(View convertView, Post item) { ((LayoutParams)((ViewGroup)convertView).getChildAt(0).getLayoutParams()).width = item.getReplyTo() == null ? 0 : convertView.getContext().getResources().getDimensionPixelSize(R.dimen.nested_post_indent_width); if (((ThreadAdapter)getAdapter()).getIndentSpec() != null) { Integer indent = ((ThreadAdapter)getAdapter()).getIndentSpec().get(item.getOriginalId()); indent = indent == null ? 0 : indent; indent = Math.min(MAX_INDENT, indent - 2); ((LayoutParams)((ViewGroup)convertView).getChildAt(0).getLayoutParams()).leftMargin = Math.max(0, (indent * convertView.getContext().getResources().getDimensionPixelSize(R.dimen.nested_post_indent_margin))); int colourHash = item.getReplyTo() == null ? item.getOriginalId().hashCode() : item.getReplyTo().hashCode(); colourHash = colourHash >= 0xffffffff ? colourHash / 2 : colourHash; try { int color = 0x7F000000; if (indent < MAX_INDENT) { String colourStr = Integer.toHexString(colourHash); if (colourStr.length() > 8) { colourStr = colourStr.substring(0, 7); } else if (colourStr.length() < 8) { colourStr = StringUtils.padTo(colourStr, 8, "F"); } color = Color.parseColor("#" + colourStr); color = (0x7F << 24) | (color & 0x00ffffff); } ((ViewGroup)convertView).getChildAt(0).setBackgroundColor(color); } catch (Exception e) { Debug.out(e); } } ((ViewGroup)convertView).getChildAt(0).setVisibility(View.VISIBLE); } }